<html>
 <head>
  <meta charset="UTF-8">
 </head>
 <body>
  <h1 data-lake-id="bEhiN" id="bEhiN"><span data-lake-id="u8ad88bd6" id="u8ad88bd6">典型回答</span></h1>
  <p data-lake-id="u6512efa1" id="u6512efa1"><br></p>
  <p data-lake-id="u1514b32b" id="u1514b32b"><span data-lake-id="u9b467c7a" id="u9b467c7a">不一样，这是MySQL中典型的深度分页的问题。</span></p>
  <p data-lake-id="u4e4615e1" id="u4e4615e1"><span data-lake-id="u53257bb0" id="u53257bb0">​</span><br></p>
  <p data-lake-id="u7872ecb8" id="u7872ecb8"><span data-lake-id="udd498770" id="udd498770">MySQL</span><span data-lake-id="u269bf7cb" id="u269bf7cb" class="lake-fontsize-11" style="color: rgb(51, 51, 51)">的limit m n工作原理就是先读取前面m+n条记录，然后抛弃前m条，然后返回后面n条数据，所以m越大，偏移量越大，性能就越差。</span></p>
  <p data-lake-id="uec968c7a" id="uec968c7a"><span data-lake-id="u6f2c9a07" id="u6f2c9a07" class="lake-fontsize-11" style="color: rgb(51, 51, 51)">​</span><br></p>
  <p data-lake-id="u4d35c4cd" id="u4d35c4cd"><span data-lake-id="u3a860565" id="u3a860565" class="lake-fontsize-11" style="color: rgb(51, 51, 51)">所以，</span><span data-lake-id="ua79502c7" id="ua79502c7">limit 10000000,100要比limit 0,100的性能差的多，因为他要先读取10000100条数据，然后再抛弃前面的10000000条。</span></p>
  <p data-lake-id="u2bac5085" id="u2bac5085"><span data-lake-id="u1d3c599c" id="u1d3c599c">​</span><br></p>
  <p data-lake-id="u75fdff08" id="u75fdff08"><br></p>
  <h1 data-lake-id="qioKp" id="qioKp"><span data-lake-id="u9a44d086" id="u9a44d086">扩展知识</span></h1>
  <h2 data-lake-id="i9zs8" id="i9zs8"><span data-lake-id="ua001db8a" id="ua001db8a">limit优化</span></h2>
  <p data-lake-id="u4bc4cd7e" id="u4bc4cd7e"><br></p>
  <p data-lake-id="ud1caa63a" id="ud1caa63a"><span data-lake-id="u94b9b8fb" id="u94b9b8fb">通常，我们在查询数据的时候，如果明确的知道我们想要多少行的话，那么建议大家在查询语句中使用limit，而不是把整个结果集查出来再自己丢弃那些不用的数据。</span></p>
  <p data-lake-id="u9b57cd0c" id="u9b57cd0c"><span data-lake-id="u85b47b4b" id="u85b47b4b">​</span><br></p>
  <p data-lake-id="ub76ff2a4" id="ub76ff2a4"><span data-lake-id="u76ef9344" id="u76ef9344">虽然我们前面提过，深度分页的时候，MySQL自己也是先全都查出来，再丢弃的，但是，MySQL针对limit也是有一些优化的。但是下面我们要介绍的优化前提都是使用limit的同时没有用having语句。</span></p>
  <p data-lake-id="u8e42ad27" id="u8e42ad27"><span data-lake-id="ua0165601" id="ua0165601">​</span><br></p>
  <p data-lake-id="uc7dbc2be" id="uc7dbc2be"><span data-lake-id="ua57c8086" id="ua57c8086">1、MySQL通常更愿意执行全表扫描，但是如果你用LIMIT只查询几行记录的话，MySQL在某些情况下可能会使用索引。</span></p>
  <p data-lake-id="ucdb7e1fc" id="ucdb7e1fc"><span data-lake-id="u09a07ddf" id="u09a07ddf" class="lake-fontsize-12" style="color: rgb(0, 0, 0)">​</span><br></p>
  <p data-lake-id="uc9f9ad8c" id="uc9f9ad8c"><span data-lake-id="ua05570e5" id="ua05570e5">2、</span><strong><span data-lake-id="u9679bf8a" id="u9679bf8a">如果你将LIMIT row_count子句与ORDER BY子句组合在一起使用的话，MySQL会在找到排序结果的row_count行数据后后立即停止排序，而不是对整个结果进行排序</span></strong><span data-lake-id="u53e1f365" id="u53e1f365">。如果使用索引来完成排序，这将非常快。</span></p>
  <p data-lake-id="ue19e86cc" id="ue19e86cc"><span data-lake-id="u4470ff37" id="u4470ff37">​</span><br></p>
  <blockquote data-lake-id="u1ea29337" id="u1ea29337">
   <p data-lake-id="ue0756cac" id="ue0756cac"><span data-lake-id="ud02833d5" id="ud02833d5">当ORDER BY子句使用了索引时，MySQL就能够基于已经排好序的索引树快速找到所需的前N行数据，而不需要对整个表进行全表扫描和排序了。</span></p>
  </blockquote>
  <p data-lake-id="ufd3b6968" id="ufd3b6968"><span data-lake-id="u45ebc123" id="u45ebc123" class="lake-fontsize-12" style="color: rgb(0, 0, 0)">​</span><br></p>
  <p data-lake-id="ubebc5468" id="ubebc5468"><span data-lake-id="u49ae9d57" id="u49ae9d57">3、</span><strong><span data-lake-id="u3e756d8a" id="u3e756d8a">如果LIMIT row_count与DISTINCT一起使用，一旦找到row_count惟一的行，MySQL就会停止。</span></strong></p>
  <p data-lake-id="ue38f86c8" id="ue38f86c8"><span data-lake-id="u13627183" id="u13627183">​</span><br></p>
  <p data-lake-id="u1dee76f6" id="u1dee76f6"><span data-lake-id="uaa78b7d9" id="uaa78b7d9">4、LIMIT 0 可以快速返回一个空的结果集，这是用来检测一个查询是否有效的一种很有用的方法。</span></p>
  <p data-lake-id="u8d597ae9" id="u8d597ae9"><span data-lake-id="ua758b4b3" id="ua758b4b3">​</span><br></p>
  <p data-lake-id="uc76d1ae0" id="uc76d1ae0"><span data-lake-id="ud315c1d5" id="ud315c1d5">5、如果ORDER BY不走索引，而且后面还带了LIMIT的话，那么优化器可能可以避免用一个合并文件，并使用内存中的filesort操作对内存中的行进行排序。</span></p>
  <p data-lake-id="ud3ac4e07" id="ud3ac4e07"><span data-lake-id="u342842f6" id="u342842f6">​</span><br></p>
  <h2 data-lake-id="GYcr0" id="GYcr0"><span data-lake-id="uda1f3d30" id="uda1f3d30">limit 和 order by</span></h2>
  <p data-lake-id="u2e31539f" id="u2e31539f"><br></p>
  <p data-lake-id="ubf09daae" id="ubf09daae"><span data-lake-id="ucbd457d8" id="ucbd457d8">我们知道，当我们在查询的时候，对某个字段order by时，如果这个字段有一些重复值，那么MySQL会是可以自由的以任意顺序返回这些行记录的，并且根据总体的执行计划而有有不同的表现。也就是说，排序结果可能是不固定的。</span></p>
  <p data-lake-id="uc6068964" id="uc6068964"><span data-lake-id="u5301f2e1" id="u5301f2e1">​</span><br></p>
  <p data-lake-id="u4c63aa7f" id="u4c63aa7f"><span data-lake-id="u9c098e5a" id="u9c098e5a">所以，当order by语句中，有Limit的时候，可能每次的查询结构都不一样。比如有下面两次查询的结果可能就不一样：</span></p>
  <p data-lake-id="ud9c5ca53" id="ud9c5ca53"><span data-lake-id="u7a7d5e54" id="u7a7d5e54">​</span><br></p>
  <pre lang="java"><code>
mysql&gt; SELECT * FROM ratings ORDER BY category;
+----+----------+--------+
| id | category | rating |
+----+----------+--------+
|  1 |        1 |    4.5 |
|  5 |        1 |    3.2 |
|  3 |        2 |    3.7 |
|  4 |        2 |    3.5 |
|  6 |        2 |    3.5 |
|  2 |        3 |    5.0 |
|  7 |        3 |    2.7 |
+----+----------+--------+
</code></pre>
  <p data-lake-id="u01ea9ed9" id="u01ea9ed9"><br></p>
  <pre lang="java"><code>
mysql&gt; SELECT * FROM ratings ORDER BY category LIMIT 5;
+----+----------+--------+
| id | category | rating |
+----+----------+--------+
|  1 |        1 |    4.5 |
|  5 |        1 |    3.2 |
|  4 |        2 |    3.5 |
|  3 |        2 |    3.7 |
|  6 |        2 |    3.5 |
+----+----------+--------+
</code></pre>
  <p data-lake-id="u3d6f6c55" id="u3d6f6c55"><span data-lake-id="ue4e95b38" id="ue4e95b38">​</span><br></p>
  <p data-lake-id="uab61bebc" id="uab61bebc"><span data-lake-id="u27f74253" id="u27f74253">那么该怎么解决呢？一个好的办法就是排序的时候不要只用一个字段，可以再加一个字段，比如id字段这种一定不会重复的。</span></p>
  <p data-lake-id="u19587fe9" id="u19587fe9"><span data-lake-id="ub4cffaa0" id="ub4cffaa0">​</span><br></p>
  <pre lang="java"><code>
mysql&gt; SELECT * FROM ratings ORDER BY category,id LIMIT 5;
</code></pre>
  <p data-lake-id="u415c1d18" id="u415c1d18"><br></p>
  <h2 data-lake-id="V7mmF" id="V7mmF"><br></h2>
 </body>
</html>